/*
* Copyright (C) 2010 - 2012 Interactive Media Management
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package dk.i2m.converge.jsf.beans;
import dk.i2m.converge.core.DataNotFoundException;
import dk.i2m.converge.core.metadata.*;
import dk.i2m.converge.ejb.facades.MetaDataFacadeLocal;
import dk.i2m.jsf.JsfUtils;
import java.io.IOException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.LocaleUtils;
import org.richfaces.event.UploadEvent;
import org.richfaces.model.UploadItem;
/**
* Backing bean for the {@code Concepts}.
*
* @author Allan Lykke Christensen
*/
public class Concepts {
private static final Logger LOG = Logger.getLogger(Concepts.class.getName());
@EJB private MetaDataFacadeLocal metaDataFacade;
private DataModel mostPopular = null;
private DataModel mostRecent = null;
private String search = "";
private String show = "";
private String importLanguage;
private String importFormat = "NEWSML_G2_KNOWLEDGE_ITEM";
private Long id;
private List<UploadItem> uploadedConcepts = new ArrayList<UploadItem>();
private Map<String, String> availableLanguages =
new LinkedHashMap<String, String>();
private Concept selectedConcept;
private DataModel searchResult;
private String newName = "";
private String newType = "";
private boolean updatingConcept = false;
private Concept selectedMetaDataConcept;
private String conceptAddType = "";
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
if (id != null) {
try {
Logger.getLogger(Concepts.class.getName()).log(Level.INFO,
"Loading concept {0}", id);
selectedConcept = metaDataFacade.findConceptById(id);
show = "SHOW_CONCEPT";
} catch (DataNotFoundException ex) {
Logger.getLogger(Concepts.class.getName()).log(Level.SEVERE,
"Unknown concept identifier", ex);
}
}
}
public void onSearch(ActionEvent event) {
List<Concept> found = metaDataFacade.search(search);
searchResult = new ListDataModel(found);
show = "SEARCH_RESULTS";
updatingConcept = false;
}
public void onShowConcept(ActionEvent event) {
show = "SHOW_CONCEPT";
updatingConcept = false;
}
public void onEditConcept(ActionEvent event) {
updatingConcept = true;
}
public void onSaveConcept(ActionEvent event) {
selectedConcept = metaDataFacade.update(selectedConcept);
updatingConcept = false;
mostRecent = null;
}
public void onSaveNewConcept(ActionEvent event) {
show = "SHOW_CONCEPT";
Class c;
try {
c = Class.forName(newType);
selectedConcept = (Concept) c.newInstance();
selectedConcept.setName(newName);
selectedConcept = metaDataFacade.create(selectedConcept);
updatingConcept = true;
mostRecent = null;
} catch (InstantiationException ex) {
Logger.getLogger(Concepts.class.getName()).log(Level.SEVERE, null,
ex);
} catch (IllegalAccessException ex) {
Logger.getLogger(Concepts.class.getName()).log(Level.SEVERE, null,
ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(Concepts.class.getName()).log(Level.SEVERE, null,
ex);
}
}
public void onShowSubjects(ActionEvent event) {
show = "SEARCH_RESULTS";
List<Concept> found = metaDataFacade.findConceptByType(Subject.class);
searchResult = new ListDataModel(found);
}
public void onShowOverview(ActionEvent event) {
show = "OVERVIEW";
}
public void onShowGeoAreas(ActionEvent event) {
show = "SEARCH_RESULTS";
List<Concept> found = metaDataFacade.findConceptByType(GeoArea.class);
searchResult = new ListDataModel(found);
}
public void onShowPersons(ActionEvent event) {
show = "SEARCH_RESULTS";
List<Concept> found = metaDataFacade.findConceptByType(Person.class);
searchResult = new ListDataModel(found);
}
public void onShowPoi(ActionEvent event) {
show = "SEARCH_RESULTS";
List<Concept> found = metaDataFacade.findConceptByType(
PointOfInterest.class);
searchResult = new ListDataModel(found);
}
public void onShowOrganisations(ActionEvent event) {
show = "SEARCH_RESULTS";
List<Concept> found = metaDataFacade.findConceptByType(
Organisation.class);
searchResult = new ListDataModel(found);
}
public void onReadAvailableLanguages(ActionEvent event) throws IOException {
this.availableLanguages.clear();
for (UploadItem item : this.uploadedConcepts) {
byte[] fileData;
if (item.isTempFile()) {
fileData = FileUtils.readFileToByteArray(item.getFile());
} else {
fileData = item.getData();
}
String xml = new String(fileData);
String[] languages = metaDataFacade.getLanguagesAvailableForImport(
xml);
for (String lang : languages) {
lang = lang.replaceAll("-", "_");
Locale locale = LocaleUtils.toLocale(lang);
this.availableLanguages.put(locale.getDisplayLanguage(), lang);
}
}
}
/**
* Event handler for uploading and importing concepts.
*
* @param event Event that invoked the handler
*/
public void onUploadConcepts(UploadEvent event) throws IOException {
UploadItem item = event.getUploadItem();
this.uploadedConcepts.add(item);
}
/**
* Event handler for preparing the import of concepts.
*
* @param event Event that invoked the handler
*/
public void onPreImport(ActionEvent event) {
this.uploadedConcepts = new ArrayList<UploadItem>();
this.availableLanguages = new LinkedHashMap<String, String>();
}
/**
* Event handler for exporting subjects in a Microsoft Excel spreadsheet.
*
* @param event Event that invoked the handler
*/
public void onExportSubjects(ActionEvent event) {
byte[] output = metaDataFacade.exportConcepts(Subject.class, ConceptOutput.MICROSOFT_EXCEL);
try {
// here you need to get the byte[] representation of
// the file you want to send
byte[] binary_data = output;
String filename = "subjects.xls";
FacesContext fctx = FacesContext.getCurrentInstance();
ExternalContext ectx = fctx.getExternalContext();
HttpServletResponse response = (HttpServletResponse) ectx.getResponse();
response.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
response.setHeader("Content-Transfer-Encoding", "Binary");
response.setHeader("Pragma", "private");
response.setHeader("cache-control", "private, must-revalidate");
response.setContentType("application/vnd.ms-excel");
ServletOutputStream outs = response.getOutputStream();
outs.write(binary_data);
outs.flush();
outs.close();
response.flushBuffer();
fctx.responseComplete();
} catch (IOException ex) {
LOG.log(Level.WARNING, "Writing the Excel Document was NOT Successfull");
LOG.log(Level.FINEST, "", ex);
}
}
/**
* Event handler for importing the uploaded subject files.
*
* @param event Event that invoked the handler
* @throws IOException If any of the uploaded files could not be read
*/
public void onImport(ActionEvent event) throws IOException {
int imported = 0;
for (UploadItem item : this.uploadedConcepts) {
byte[] fileData;
if (item.isTempFile()) {
fileData = FileUtils.readFileToByteArray(item.getFile());
} else {
fileData = item.getData();
}
String xml = new String(fileData);
if (getImportLanguage() != null) {
imported += metaDataFacade.importKnowledgeItem(xml,
getImportLanguage());
}
}
JsfUtils.createMessage("frmSubjects", FacesMessage.SEVERITY_INFO, Bundle.i18n.name(),
"Concepts_X_SUBJECTS_IMPORTED", new Object[]{imported});
}
public void onDeleteConcept(ActionEvent event) {
if (getSelectedConcept() != null) {
metaDataFacade.delete(getSelectedConcept().getClass(),
getSelectedConcept().getId());
}
updatingConcept = false;
show = "OVERVIEW";
mostRecent = null;
JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_INFO, Bundle.i18n.name(),
"Concepts_CONCEPT_DELETED");
}
public void onNewConcept(ActionEvent event) {
newName = "";
newType = "";
}
public boolean isUpdatingConcept() {
return updatingConcept;
}
public void setUpdatingConcept(boolean updatingConcept) {
this.updatingConcept = updatingConcept;
}
public DataModel getSearchResult() {
return searchResult;
}
public void setSearchResult(DataModel searchResult) {
this.searchResult = searchResult;
}
public Concept getSelectedConcept() {
return selectedConcept;
}
public void setSelectedConcept(Concept selectedConcept) {
this.selectedConcept = selectedConcept;
}
public DataModel getMostPopular() {
if (mostPopular == null) {
mostPopular = new ListDataModel(new ArrayList());
}
return mostPopular;
}
public DataModel getMostRecent() {
if (mostRecent == null) {
mostRecent =
new ListDataModel(metaDataFacade.findRecentConcepts(10));
}
return mostRecent;
}
public String getSearch() {
return search;
}
public void setSearch(String search) {
this.search = search;
}
public boolean isShowConcept() {
return show.equalsIgnoreCase("SHOW_CONCEPT");
}
public boolean isShowSearchResults() {
return show.equalsIgnoreCase("SEARCH_RESULTS");
}
public boolean isShowOverview() {
return show.equalsIgnoreCase("OVERVIEW");
}
public Map<String, String> getAvailableLanguages() {
return availableLanguages;
}
public void setAvailableLanguages(Map<String, String> availableLanguages) {
this.availableLanguages = availableLanguages;
}
public String getImportFormat() {
return importFormat;
}
public void setImportFormat(String importFormat) {
this.importFormat = importFormat;
}
public String getImportLanguage() {
return importLanguage;
}
public void setImportLanguage(String importLanguage) {
this.importLanguage = importLanguage;
}
public List<UploadItem> getUploadedConcepts() {
return uploadedConcepts;
}
public void setUploadedConcepts(List<UploadItem> uploadedFiles) {
this.uploadedConcepts = uploadedFiles;
}
/**
* Gets the available languages for importing based on the already uploaded
* files.
*
* @return {@link Map} of {@link Locale}s with the available languages for
* importing subjects codes
* @throws IOException
* If any of the uploaded files could not be read
*/
public Map<String, String> getAvailableImportLanguages() {
return this.availableLanguages;
}
public String getNewName() {
return newName;
}
public void setNewName(String newName) {
this.newName = newName;
}
public String getNewType() {
return newType;
}
public void setNewType(String newType) {
this.newType = newType;
}
public DataModel getMetaDataSubjects() {
return new ListDataModel(metaDataFacade.findConceptByType(Subject.class));
}
public DataModel getMetaDataOrganisations() {
return new ListDataModel(metaDataFacade.findConceptByType(
Organisation.class));
}
public DataModel getMetaDataLocations() {
return new ListDataModel(metaDataFacade.findConceptByType(GeoArea.class));
}
public DataModel getMetaDataPointsOfInterest() {
return new ListDataModel(metaDataFacade.findConceptByType(
PointOfInterest.class));
}
public DataModel getMetaDataPersons() {
return new ListDataModel(metaDataFacade.findConceptByType(Person.class));
}
public void onSelectMetaData(ActionEvent event) {
if (conceptAddType.equalsIgnoreCase("RELATED")) {
selectedConcept.getRelated().add(selectedMetaDataConcept);
selectedConcept = metaDataFacade.update(selectedConcept);
JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_INFO, Bundle.i18n.name(),
"Concepts_META_DATA_X_SELECTED_RELATED",
new Object[]{getSelectedMetaDataConcept().getName(),
getSelectedConcept().getName()});
} else if (conceptAddType.equalsIgnoreCase("SAME_AS")) {
selectedConcept.getSameAs().add(selectedMetaDataConcept);
selectedConcept = metaDataFacade.update(selectedConcept);
try {
selectedMetaDataConcept =
metaDataFacade.findConceptById(selectedMetaDataConcept.
getId());
selectedMetaDataConcept.getSameAs().add(selectedConcept);
selectedMetaDataConcept = metaDataFacade.update(
selectedMetaDataConcept);
selectedConcept =
metaDataFacade.findConceptById(selectedConcept.getId());
} catch (Exception ex) {
JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_ERROR, Bundle.i18n.name(),
"Generic_AN_ERROR_OCCURRED_X", new Object[]{ex.getMessage()});
}
JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_INFO, Bundle.i18n.name(),
"Concepts_META_DATA_X_SELECTED_SAME_AS",
new Object[]{getSelectedMetaDataConcept().getName(),
getSelectedConcept().getName()});
} else if (conceptAddType.equalsIgnoreCase("BROADER")) {
selectedConcept.getBroader().add(selectedMetaDataConcept);
selectedConcept = metaDataFacade.update(selectedConcept);
JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_INFO, Bundle.i18n.name(),
"Concepts_META_DATA_X_SELECTED_BROADER",
new Object[]{getSelectedMetaDataConcept().getName(),
getSelectedConcept().getName()});
} else if (conceptAddType.equalsIgnoreCase("NARROWER")) {
selectedConcept.getNarrower().add(selectedMetaDataConcept);
selectedConcept = metaDataFacade.update(selectedConcept);
try {
selectedMetaDataConcept =
metaDataFacade.findConceptById(selectedMetaDataConcept.
getId());
selectedMetaDataConcept.getBroader().add(selectedConcept);
selectedMetaDataConcept = metaDataFacade.update(
selectedMetaDataConcept);
selectedConcept =
metaDataFacade.findConceptById(selectedConcept.getId());
} catch (Exception ex) {
JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_ERROR, Bundle.i18n.name(),
"Generic_AN_ERROR_OCCURRED_X", new Object[]{ex.getMessage()});
}
JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_INFO, Bundle.i18n.name(),
"Concepts_META_DATA_X_SELECTED_NARROWER",
new Object[]{getSelectedMetaDataConcept().getName(),
getSelectedConcept().getName()});
} else {
JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_INFO, Bundle.i18n.name(),
"Concepts_META_DATA_SELECTED_ERROR");
}
}
public void onSelectMetaDataRelated(ActionEvent event) {
selectedMetaDataConcept = null;
conceptAddType = "RELATED";
}
public void onSelectMetaDataSameAs(ActionEvent event) {
selectedMetaDataConcept = null;
conceptAddType = "SAME_AS";
}
public void onSelectMetaDataBroader(ActionEvent event) {
selectedMetaDataConcept = null;
conceptAddType = "BROADER";
}
public void onSelectMetaDataNarrower(ActionEvent event) {
selectedMetaDataConcept = null;
conceptAddType = "NARROWER";
}
public Concept getSelectedMetaDataConcept() {
return selectedMetaDataConcept;
}
public void setSelectedMetaDataConcept(Concept selectedMetaDataConcept) {
this.selectedMetaDataConcept = selectedMetaDataConcept;
}
public void onRemoveNarrowerFromConcept(ActionEvent event) {
selectedMetaDataConcept.getBroader().remove(selectedConcept);
selectedMetaDataConcept = metaDataFacade.update(selectedMetaDataConcept);
try {
selectedConcept = metaDataFacade.findConceptById(selectedConcept.
getId());
} catch (DataNotFoundException ex) {
JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_ERROR, Bundle.i18n.name(),
"Generic_AN_ERROR_OCCURRED_X", new Object[]{ex.getMessage()});
}
}
public void onRemoveBroaderFromConcept(ActionEvent event) {
try {
selectedConcept = metaDataFacade.findConceptById(selectedConcept.
getId());
selectedConcept.getBroader().remove(selectedMetaDataConcept);
selectedConcept = metaDataFacade.update(selectedConcept);
} catch (DataNotFoundException ex) {
JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_ERROR, Bundle.i18n.name(),
"Generic_AN_ERROR_OCCURRED_X", new Object[]{ex.getMessage()});
}
}
public void onRemoveRelatedFromConcept(ActionEvent event) {
try {
selectedConcept = metaDataFacade.findConceptById(selectedConcept.
getId());
selectedConcept.getRelated().remove(selectedMetaDataConcept);
selectedConcept = metaDataFacade.update(selectedConcept);
} catch (DataNotFoundException ex) {
JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_ERROR, Bundle.i18n.name(),
"Generic_AN_ERROR_OCCURRED_X", new Object[]{ex.getMessage()});
}
}
public void onRemoveSameAsFromConcept(ActionEvent event) {
try {
selectedMetaDataConcept.getSameAs().remove(selectedConcept);
selectedMetaDataConcept = metaDataFacade.update(
selectedMetaDataConcept);
selectedConcept = metaDataFacade.findConceptById(selectedConcept.
getId());
selectedConcept.getSameAs().remove(selectedMetaDataConcept);
selectedConcept = metaDataFacade.update(selectedConcept);
} catch (DataNotFoundException ex) {
JsfUtils.createMessage("frmPage", FacesMessage.SEVERITY_ERROR, Bundle.i18n.name(),
"Generic_AN_ERROR_OCCURRED_X", new Object[]{ex.getMessage()});
}
}
public void onCancelConcept(ActionEvent event) {
updatingConcept = false;
}
}